import os
import threading
from tkinter import filedialog
import customtkinter as ctk
from pdf2docx import Converter
import traceback
import sys
import logging

class PDFToWordConverter:
    """
    PDF转Word转换器的图形界面实现
    """
    def __init__(self):
        try:
            # 设置主题
            ctk.set_appearance_mode("light")
            ctk.set_default_color_theme("blue")

            # 创建主窗口
            self.window = ctk.CTk()
            self.window.title("PDF转Word工具")
            self.window.geometry("400x300")
            self.window.resizable(False, False)

            # 创建界面元素
            self.setup_ui()
        except Exception as e:
            self.show_error_and_wait(e)

    def setup_ui(self):
        """
        设置用户界面元素
        """
        # 标题标签
        title_label = ctk.CTkLabel(
            self.window, 
            text="PDF转Word工具", 
            font=("Arial", 20, "bold")
        )
        title_label.pack(pady=20)

        # 文件路径显示
        self.file_label = ctk.CTkLabel(
            self.window,
            text="未选择文件",
            wraplength=350
        )
        self.file_label.pack(pady=10)

        # 选择文件按钮
        select_btn = ctk.CTkButton(
            self.window,
            text="选择PDF文件",
            command=self.select_file
        )
        select_btn.pack(pady=10)

        # 转换按钮
        self.convert_btn = ctk.CTkButton(
            self.window,
            text="开始转换",
            command=self.start_conversion,
            state="disabled"
        )
        self.convert_btn.pack(pady=10)

        # 进度条
        self.progress_bar = ctk.CTkProgressBar(
            self.window,
            width=300
        )
        self.progress_bar.pack(pady=20)
        self.progress_bar.set(0)

        # 状态标签
        self.status_label = ctk.CTkLabel(
            self.window,
            text="等待选择文件..."
        )
        self.status_label.pack(pady=10)

    def select_file(self):
        """
        选择PDF文件
        """
        file_path = filedialog.askopenfilename(
            filetypes=[("PDF文件", "*.pdf")]
        )
        if file_path:
            self.pdf_path = file_path
            self.file_label.configure(text=file_path)
            self.convert_btn.configure(state="normal")
            self.status_label.configure(text="已选择文件，可以开始转换")

    def start_conversion(self):
        """
        开始转换过程
        """
        self.convert_btn.configure(state="disabled")
        self.progress_bar.set(0)
        self.status_label.configure(text="正在转换...")
        
        # 在新线程中执行转换
        thread = threading.Thread(target=self.convert_pdf_to_word)
        thread.start()

    def convert_pdf_to_word(self):
        """
        执行PDF到Word的转换，保持原格式
        """
        try:
            # 生成输出文件路径
            output_path = os.path.splitext(self.pdf_path)[0] + '.docx'
            
            # 更新状态
            self.status_label.configure(text="正在转换PDF...")
            self.progress_bar.set(0.1)  # 显示开始转换
            
            try:
                # 创建转换器并设置参数
                cv = Converter(self.pdf_path)
                
                # 转换参数配置
                convert_options = {
                    'debug_level': logging.WARNING,  # 设置日志级别
                    # 页面布局参数
                    'layout_kwargs': {
                        'margin': {
                            'top': 0.0,     # 保持原始页边距
                            'bottom': 0.0,
                            'left': 0.0,
                            'right': 0.0
                        },
                        'font_size_scaling': 1.0,  # 保持原始字体大小
                        'line_overlap_threshold': 0.9,  # 提高行识别准确度
                        'line_break_width_ratio': 0.1,  # 提高换行识别准确度
                        'line_break_free_space_ratio': 0.1,  # 提高分栏识别准确度
                    },
                    # 表格处理参数
                    'table_kwargs': {
                        'cell_margin': {'top': 2, 'bottom': 2, 'left': 2, 'right': 2},  # 单元格边距
                        'line_separate_threshold': 0.5,  # 提高表格线识别准确度
                    },
                    # 图片处理参数
                    'image_kwargs': {
                        'min_image_area': 100,  # 最小图片面积
                        'max_image_area': 99999999,  # 最大图片面积
                    }
                }
                
                # 执行转换
                cv.convert(output_path, **convert_options)
                cv.close()
                
                # 检查转换是否成功
                if os.path.exists(output_path):
                    self.progress_bar.set(1)
                    self.status_label.configure(text="转换完成！文件已保存在原PDF同目录下")
                else:
                    raise Exception("转换失败：未能生成Word文件")
                    
            except Exception as e:
                raise Exception(f"转换过程出错：{str(e)}")
            finally:
                # 恢复按钮状态
                self.convert_btn.configure(state="normal")
                
        except Exception as error:
            # 显示错误信息
            self.status_label.configure(text=f"转换失败：{str(error)}")
            self.convert_btn.configure(state="normal")
            self.progress_bar.set(0)

    def show_error_and_wait(self, error):
        """
        显示错误信息并等待用户确认
        """
        print(f"发生错误：{str(error)}")
        print("详细错误信息：")
        print(traceback.format_exc())
        input("按回车键退出...")

    def run(self):
        """
        运行应用程序
        """
        self.window.mainloop()

def main():
    try:
        print("="*50)
        print("PDF转Word工具启动中...")
        print("="*50)
        
        print("\n1. 检查Python版本...")
        import sys
        print(f"Python版本: {sys.version}")
        
        print("\n2. 检查依赖...")
        try:
            import customtkinter as ctk
            print("✓ customtkinter 已加载")
        except ImportError:
            print("✗ customtkinter 未安装，请运行: python -m pip install customtkinter")
            raise
            
        try:
            from pdf2docx import Converter
            print("✓ pdf2docx 已加载")
        except ImportError:
            print("✗ pdf2docx 未安装，请运行: python -m pip install pdf2docx")
            raise

        print("\n3. 初始化界面...")
        app = PDFToWordConverter()
        print("✓ 界面初始化完成")
        
        print("\n4. 启动程序...")
        app.run()
        
    except Exception as e:
        print("\n"+"="*50)
        print("程序运行出错！")
        print(f"错误类型: {type(e).__name__}")
        print(f"错误信息: {str(e)}")
        print("\n详细错误信息:")
        print(traceback.format_exc())
        print("="*50)
        input("\n按回车键退出...")

if __name__ == "__main__":
    main() 